/*
*********************************************************************************************************
*                                             uC/GUI V3.98
*                        Universal graphic software for embedded applications
*
*                       (c) Copyright 2002, Micrium Inc., Weston, FL
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*              �C/GUI is protected by international copyright laws. Knowledge of the
*              source code may not be used to write a similar product. This file may
*              only be used in accordance with a license and should not be redistributed
*              in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File        : GUI_DispStringInRect.c
Purpose     : Implementation of GUI_DispStringInRect
---------------------------END-OF-HEADER------------------------------
*/

//#include <stddef.h>           /* needed for definition of NULL */
#include <stdio.h>
#include "GUI_Protected.h"
#if GUI_WINSUPPORT
  #include "WM.h"
#endif
 
/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       GUI__DispStringInRect
*/
void GUI__DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT* pRect, I32 TextAlign, I32 MaxNumChars) {
	GUI_RECT r;
	GUI_RECT rLine;
	I32 y = 0;
	const char GUI_UNI_PTR *sOrg =s;
	I32 FontYSize;
	I32 xLine = 0;
	I32 LineLen;
	I32 NumCharsRem;           /* Number of remaining characters */
	FontYSize = GUI_GetFontDistY();
	if (pRect) {
		r = *pRect;
	} else {
		GUI_GetClientRect(&r);
	}
	/* handle vertical alignment */
	if ((TextAlign & GUI_TA_VERTICAL) == GUI_TA_TOP) {
		y = r.y0;
	} else {
		I32 NumLines;
		/* Count the number of lines */
		for (NumCharsRem = MaxNumChars, NumLines = 1; NumCharsRem ;NumLines++) {
			LineLen = GUI__GetLineNumChars(s, NumCharsRem);
			NumCharsRem -= LineLen;
			s += GUI_UC__NumChars2NumBytes(s, LineLen);
			if (GUI__HandleEOLine(&s))
				break;
		}
		/* Do the vertical alignment */
		switch (TextAlign & GUI_TA_VERTICAL) {
			case GUI_TA_BASELINE:
			case GUI_TA_BOTTOM:
				y = r.y1 -NumLines * FontYSize+1;
			break;
			case GUI_TA_VCENTER:
				y = r.y0+(r.y1-r.y0+1 -NumLines * FontYSize) /2;
				break;
		}
	}
	/* Output string */
	for (NumCharsRem = MaxNumChars, s = sOrg; NumCharsRem;) {
		I32 xLineSize;
		LineLen = GUI__GetLineNumChars(s, NumCharsRem);
		NumCharsRem -= LineLen;
		xLineSize = GUI__GetLineDistX(s, LineLen);
		switch (TextAlign & GUI_TA_HORIZONTAL) {
			case GUI_TA_HCENTER:
				xLine = r.x0+(r.x1-r.x0-xLineSize)/2;
			break;
			case GUI_TA_LEFT:
				xLine = r.x0;
			break;
			case GUI_TA_RIGHT:
				xLine = r.x1 -xLineSize + 1;
			break;
			default:
			break;
		}
		rLine.x0 = GUI_Context.DispPosX = xLine;
		rLine.x1 = rLine.x0 + xLineSize-1;
		rLine.y0 = GUI_Context.DispPosY = y;
		rLine.y1 = y + FontYSize-1;
		GUI__DispLine(s, LineLen, &rLine);
		s += GUI_UC__NumChars2NumBytes(s, LineLen);
		y += GUI_GetFontDistY();
		if (GUI__HandleEOLine(&s)){
			break;
		}
	}
}

/*********************************************************************
*
*       GUI_DispStringInRectMax
*/
#if (GUI_WINSUPPORT)
void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT* pRect, I32 TextAlign, I32 MaxLen)
{
	if (s) {
		const GUI_RECT *pOldClipRect = NULL;
		GUI_RECT r;
		if (pRect) {
			pOldClipRect = WM_SetUserClipRect(pRect);
			if (pOldClipRect) {
				GUI__IntersectRects(&r, pRect, pOldClipRect);
				WM_SetUserClipRect(&r);
			}
		}
		GUI__DispStringInRect(s, pRect, TextAlign, MaxLen);
		WM_SetUserClipRect(pOldClipRect);
	}
}

#else

void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT* pRect, I32 TextAlign, I32 MaxLen)
{
	GUI_RECT Rect_Old, r;
	if (s && pRect) {
		GUI_LOCK();
		Rect_Old = GUI_Context.ClipRect;
		GUI__IntersectRects(&r, pRect, &Rect_Old);
		LCD_SetClipRectEx(&r);
		GUI__DispStringInRect(s, pRect, TextAlign, MaxLen);
		LCD_SetClipRectEx(&Rect_Old);
		GUI_UNLOCK();
	}
}
#endif

/*********************************************************************
*
*       GUI_DispStringInRect
*/
void GUI_DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT* pRect, I32 TextAlign) {
  GUI_DispStringInRectMax(s, pRect, TextAlign, 0x7fff);
}

/*************************** End of file ****************************/
	 	 			 		    	 				 	  			   	 	 	 	 	 	  	  	      	   		 	 	 		  		  	 		 	  	  			     			       	   	 			  		    	 	     	 				  	 					 	 			   	  	  			 				 		 	 	 			     			 
